package com.imooc.api.mq;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 啊昌
 * @date 2025/9/19 19:50
 * RabbitMQSMSConfig RabbitMQ的验证码配置类
 */
@Configuration
public class RabbitMQSMSConfig {
	// 定义交换机的名称
	public static final String SMS_EXCHANGE = "sms_exchange";

	// 定义队列的名称
	public static final String SMS_QUEUE = "sms_queue";

	// 统一定义路由key
	public static final String ROUTING_KEY_SMS_SEND_LOGIN = "imooc.sms.send.login";

	/**
	 * 创建并配置短信交换机Bean
	 *
	 * @return Exchange 返回配置好的主题交换机实例
	 *         - 设置交换机类型为topic类型
	 *         - 设置交换机持久化存储
	 */
	@Bean(SMS_EXCHANGE)
	public Exchange exchange() {
		return  ExchangeBuilder
				.topicExchange(SMS_EXCHANGE)
				.durable(true) //设置交换机持久
				.build();
	}



	/**
	 * 创建并配置SMS消息队列
	 *
	 * @return 配置好的持久化队列对象
	 */
	@Bean(SMS_QUEUE)
	public Queue queue() {
		// 构建一个持久化的SMS队列
		return QueueBuilder
				.durable(SMS_QUEUE)
				.build();
	}


		/**
	 * 创建消息队列绑定关系
	 * 将短信队列绑定到短信交换机上，并设置路由键模式
	 *
	 * @param exchange 短信交换机实例
	 * @param queue 短信队列实例
	 * @return 队列与交换机的绑定关系对象
	 */
	@Bean
	public Binding binding(@Qualifier(SMS_EXCHANGE) Exchange exchange,
	                       @Qualifier(SMS_QUEUE) Queue queue) {
		// 绑定队列到交换机
		return org.springframework.amqp.core.BindingBuilder
				.bind(queue())
				.to(exchange())
				.with("imooc.sms.#")
				.noargs();
	}

}
